package uml.parser;

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

import java.util.ArrayList;

import javax.swing.JOptionPane;

import lanczos.core.ClusteringApp;

import uml.graph.Aresta;
import uml.graph.Grafo;
import uml.graph.Vertice;
import uml.gui.TelaPrincipal;


/**
 *
 * @author Paloma
 */
public class Principal {  
	static ParserXMI parser = new ParserXMI();
	static String[] verticesXML = null, namesXML = null;   
	static String[][] arestasXML = null;
	static ArrayList<Vertice> listaVertices = new ArrayList<Vertice>();
	static ArrayList<Aresta> listaArestas = new ArrayList<Aresta>();
	private static Grafo grafo;
	private static String saida;

	public void executar() {

		//Cria um objeto Grafo 
		grafo = new Grafo();
		//Carrega o arquivo XML
		parser.parser();
		//parser.imprimeVetorVertices();
		//parser.imprimeVetorArestas();

		//verticesXML recebe um conjunto de vertices que são as Tags "Classes" provinientes do XML
		verticesXML=parser.getVetorRotuloVertices();
		namesXML=parser.getNomeVertices();
		arestasXML=parser.getVetorArestas();


		// cria  todos os vertices e os adiciona em uma lista de vertices
		for (int i = 0; i <verticesXML.length; i ++){
			Vertice v = new Vertice(verticesXML[i],namesXML[i]);
			grafo.addVertice(v);
			listaVertices.add(v);

		}
		saida = "Quantidade de associações: "+ parser.getQuantidadeAssociacoes()+"\n\n";
		System.out.println("Quantidade de associações: "+ parser.getQuantidadeAssociacoes());
		//cria todas as arestas e as adiciona no grafo
		for(int i = 0; i< parser.getQuantidadeAssociacoes(); i++){

			Vertice v1,v2;
			v1=null;
			v2=null;
			for(int j=0;j<2;j++){
				//System.out.print(arestasXML[i][j]);

				if(j==0){

					//System.out.println("Adicionando o vertice V1 : "+ grafo.existeVertice(listaVertices,arestasXML[i][j]).getRotulo()+"[" +i+ "]" + "["+j+"]");
					v1=grafo.existeVertice(listaVertices,arestasXML[i][j]);

				}else if(j==1){

					//System.out.println("Adicionando o vertice V2 : "+ grafo.existeVertice(listaVertices,arestasXML[i][j]).getRotulo()+"[" +i+ "]" + "["+j+"]");
					v2=grafo.existeVertice(listaVertices,arestasXML[i][j]);;

				}   


			}
			//System.out.println(" _____ Add aresta");
			//System.out.println(arestasXML[i][2]);
			grafo.addAresta(v1, v2, Integer.parseInt(arestasXML[i][2]));
		}
		// fim da adição de todas as arestas;
		grafo.criarMatrizD();
		grafo.criarMatrizLaplace();
		System.out.println("Quantidade de Vertices:  " + grafo.getQtdVertices());
		saida = saida + "Quantidade de Vertices:  " + grafo.getQtdVertices()+"\n\n";
		//System.out.println(grafo.getQtdVertices());
		System.out.println("Quantidade de arestas: " + grafo.getQtdArestas());
		saida = saida+ "Quantidade de arestas: " + grafo.getQtdArestas()+"\n\n";
		//System.out.println(grafo.getQtdArestas());

		System.out.println("Matriz de Adjacencia: ");
		saida = saida + "Matriz de Adjacencia \n" + grafo.imprimeMatrizAdjacencia(grafo)+"\n\n";

		System.out.println("Matriz D: ");
		saida = saida + "Matriz D: \n" + grafo.imprimeMatrizD()+"\n\n";

		System.out.println("Matriz de Laplace: ");
		saida = saida + "Matriz de Laplace: \n" + grafo.imprimeMatrizLaplace()+"\n\n";
		
		ClusteringApp cp = new ClusteringApp();
		
		String componentsOutput = cp.getClusters(grafo);
		
		TelaPrincipal.exibirSaida(saida+"\n"+cp.fidlervectors);
		
		
		JOptionPane.showMessageDialog(null, componentsOutput,"Identified components",JOptionPane.PLAIN_MESSAGE);


	}

	public ParserXMI getParser() {
		return parser;
	}

	public void setParser(ParserXMI parser) {
		Principal.parser = parser;
	}

	public String getSaida() {
		return saida;
	}

	public void setSaida(String saida) {
		Principal.saida = saida;
	}

	public Grafo getGrafo() {
		return grafo;
	}

}
